package pl.edu.mimuw.mas.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Klasa reaalizuje logike zapisywania i odczytywania obiektow z/do pliku.
 */
public final class Marshaller {
	
	private static final Logger log = LoggerFactory.getLogger(Marshaller.class);

	/**
	 * Zapisz obiekt do pliku.
	 * 
	 * @param obj obiekt do zapisanie
	 * @param fileName nazwa pliku
	 */
	public static void save(Serializable obj, String fileName) {
		File f = new File(fileName);
		FileOutputStream out;
		try {
			out = new FileOutputStream(f, false);
			ObjectOutputStream writer = new ObjectOutputStream(out);
			writer.writeObject(obj);
			log.info("Zapisuję do pliku {}", fileName);
		} catch (FileNotFoundException e) {
			log.error("Błąd podczas tworzenia pliku {}", fileName, e);
		} catch (IOException e) {
			log.error("Błąd podczas zapisywanie do pliku {} ", fileName, e);
		}
	}

	/**
	 * Odczytaj obiekt z pliku.
	 * 
	 * @param fileName nazwa pliku
	 */
	public static Object read(String fileName) {
		File f = new File(fileName);
		FileInputStream in;
		try {
			in = new FileInputStream(f);
			ObjectInputStream reader = new ObjectInputStream(in);
			return reader.readObject();

		} catch (FileNotFoundException e) {
			log.error("Brak pliku {}", fileName, e);
		} catch (IOException e) {
			log.error("Blad IO pliku {}", fileName, e);
		} catch (ClassNotFoundException e) {
			log.error("Niepoprawne dane w pliku {}", fileName, e);
		} catch (ClassCastException e) {
			log.error("Nieznane dane w pliku {}", fileName, e);
		}

		return null;
	}
	
	private Marshaller() {	}
}
